package cn.haocxy.jfm.filelist;

import cn.haocxy.jfm.file.FilePath;
import cn.haocxy.jfm.file.FileType;
import cn.haocxy.jfm.util.EventHandlers;

/**
 * 文件项
 * <p>
 * 表示一个用户眼中不变的实体。
 * “用户眼中不变”是指：如果对一个文件执行改名操作，对于Path类型来说，
 * 已经是一个新的不同的对象，但对于用户来说，还是那个文件。
 * 
 * @author 蔡心宇
 *
 */
public class FileItem {

	private final FileList fileListModel;
	
	private boolean selected = false;
	
	private FilePath path;

	private final EventHandlers<SelectEvent> selectEventHandlers = new EventHandlers<>();
	
	private final EventHandlers<UnselectEvent> unselectEventHandlers = new EventHandlers<>();
	
	public FileItem(FileList fileListModel) {
		this.fileListModel = fileListModel;
	}
	
	public EventHandlers<SelectEvent> getSelectEventHandlers() {
		return selectEventHandlers;
	}
	
	public EventHandlers<UnselectEvent> getUnselectEventHandlers() {
		return unselectEventHandlers;
	}

	public FileList getFileListModel() {
		return fileListModel;
	}
	
	public void open() {
		if (path != null) {
			path.open();
		}
	}
	
	public boolean isSelected() {
		return selected;
	}
	
	public boolean inSelectGroup() {
		return fileListModel.getSelectedItems().contains(this);
	}
	
	public void select() {
		selected = true;
		fileListModel.addSelected(this);
		selectEventHandlers.applyAll(new SelectEvent());
	}
	
	public void unselect() {
		selected = false;
		fileListModel.removeSelected(this);
		unselectEventHandlers.applyAll(new UnselectEvent());
	}
	
	public void toggleSelected() {
		if (selected) {
			unselect();
		} else {
			select();
		}
	}
	
	public FilePath toFilePath() {
		return path;
	}

	public void setPath(FilePath path) {
		this.path = path;
	}
	
	public FileType getFileType() {
		return path.getFileType();
	}
	
	/* 不要公开！！以不向文件列表报告的方式选择 */
	void _select() {
		selected = true;
		selectEventHandlers.applyAll(new SelectEvent());
	}
	
	/* 不要公开！！以不向文件列表报告的方式取消选择 */
	void _unselect() {
		selected = false;
		unselectEventHandlers.applyAll(new UnselectEvent());
	}
}
